package cn.ljy.mes.service;

import cn.ljy.authority.service.BaseService;
import cn.ljy.mes.model.MesProductionOrder;
import cn.ljy.mes.model.query.MesProductionOrderQuery;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

public interface MesProductionOrderService extends BaseService<MesProductionOrder, MesProductionOrderQuery> {
    /**
     * 修改汽车订单的状态。
     * 说明：订单状态不能在update直接修改
     * @param orderId 订单号
     * @param targetStatus 订单的目标状态
     */
//    void changeStatus(@NotBlank(message = "订单号不能为空") String orderId,@NotBlank(message = "订单状态不能为空")  String targetStatus);

    /**
     * 根据商城订单生成生产订单
     * 说明：在商城和生产模块耦合度低的时候，用于直接将所有已确认的商城订单转为生产订单。
     * 规则：已经确认的商城订单可以生成生产订单，因此也可以在在商城订单转为确认状态时自动创建生产订单。
     * @return 生成的生产订单数量
     */
    int  createProductionOrdersByShopCarOrder();

    /**
     * 将生产订单转为生产状态。
     * 说明：
     * 1.只有planned状态的生产订单可以转为生产状态
     * @return
     */
    int beginProduction(@NotEmpty(message = "操作失败：请选择要生产的订单")String[] orderIds);

    /**
     * 将生产订单转为指定状态
     * 说明：
     * 1.订单状态不能在update直接修改；
     * 2.本函数只能是对paused、cancelled状态进行修改，其他状态会有相应的函数和模块完成。例如生产完成状态，是在生产步骤都完成并审核通过后自动转为生产完成状态。
     * @param orderId 生产订单ID
     * @param targetStatus 订单状态
     */
    void changeProductionStatus(@NotBlank(message = "生产订单ID不能为空") String orderId,
                   @NotBlank(message = "生产订单状态不能为空") String targetStatus);


    /**
     * 整车审核生产订单。
     * 说明：
     * (1)只有处于完成状态的订单才能审核
     * （2）审核通过后则完成订单的生产流程。
     * @param orderId 生产订单ID
     * @param auditResult 审核结果，true为审核通过
     * @param auditNote 审核通过或者不通过的理由，不能为null，但是可以为空字符串
     */
    void inspectionProductionOrders(@NotBlank(message = "生产订单ID不能为空") String orderId,
                                    @NotNull(message = "审核结果不能为空") Boolean auditResult,
                                    String auditNote
                                    );
}
